package ru.compft.common.services.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.compft.common.dao.PermissionDao;
import ru.compft.common.data.AppPermission;
import ru.compft.common.services.PermissionsService;

import javax.annotation.Resource;
import java.util.List;

/**
 * User: ASUS
 * Date: 26.10.12
 * Time: 23:46
 * Реализация сервиса работы с правами доступа пользователя
 */
@Service
public class PermissionsServiceImpl implements PermissionsService {
    private static final Logger logger = LoggerFactory.getLogger(PermissionsServiceImpl.class);

    @Resource(name = "permissionDao")
    private PermissionDao permissionDao;

//    @Resource(name = "permissionCache")
//    private PermissionCache permissionCache;

    @Override
    public List<AppPermission> getAllAppPermission() {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (permissionCache.isInitialised()) {
//            return permissionCache.getValues();
//        } else {
            return permissionDao.getAllPermissions();
//        }
    }

    @Override
    public List<AppPermission> getPermissions(int from, int count) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (permissionCache.isInitialised()) {
//            return CommonUtils.getPartOfList(from, count, permissionCache.getValues());
//        } else {
            return permissionDao.getPermissions(from, count);
//        }
    }

    @Override
    public int countAllPermissions() {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (permissionCache.isInitialised()) {
//            return permissionCache.getValues().size();
//        } else {
            return permissionDao.countAllPermissions();
//        }
    }

    @Override
    public AppPermission getPermissionByCode(String code) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (permissionCache.isInitialised()) {
//            return permissionCache.getCodeToPermissionMap().get(code);
//        } else {
            return permissionDao.getPermissionByCode(code);
//        }
    }

    @Override
    public AppPermission findPermissionById(Long id) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (permissionCache.isInitialised()) {
//            return permissionCache.getIdToPermissionMap().get(id);
//        } else {
            return permissionDao.getPermissionById(id);
//        }
    }

//    @Override
//    public List<AppPermission> getAllPermissionsByRoleId(Long permissionId) {
//        // Преинициализация
//        preInit();
//
//        final List<AppPermission> resultList = new ArrayList<AppPermission>();
//
//        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (permissionToPermissionCache.isInitialised()) {
//            // получаем id всех прав доступа для id данной роли
//            final List<Long> permissionsIdList = permissionToPermissionCache.getRoleToPermissionsMap().get(permissionId);
//            if (!CollectionUtils.isEmpty(permissionsIdList)) {
//                for (Long permissionId : permissionsIdList) {
//                    final AppPermission appPermission = findPermissionById(permissionId);
//                    if (appPermission != null) resultList.add(appPermission);
//                }
//            }
//        } else {
//            final List<AppRoleToPermission> permissionsByRoleId = permissionToPermissionDao.getAllPermissionsByRoleId(permissionId);
//            if (!CollectionUtils.isEmpty(permissionsByRoleId)) {
//                for (AppRoleToPermission appRoleToPermission : permissionsByRoleId) {
//                    final AppPermission appPermission = findPermissionById(appRoleToPermission.getPermissionId());
//                    if (appPermission != null) resultList.add(appPermission);
//                }
//            }
//        }
//
//        return resultList;
//    }

//    @Override
//    public List<AppRole> getAllRoleByPermissionId(Long id) {
//        return null;  //To change body of implemented methods use File | Settings | File Templates.
//    }

    @Override
    public boolean createPermission(AppPermission newPermission) {
        if (newPermission != null) {
            if (newPermission.getId() != null) {
                // обновляем роль в БД
                final AppPermission updated = permissionDao.update(newPermission);

                // обновляем в кеше
//                permissionCache.addToAllCaches(updated.getId(), updated.getCode(), updated);
                return true;
            } else {
                permissionDao.createPermission(newPermission);

                // добавляем в кеш
//                permissionCache.addToAllCaches(newPermission.getId(), newPermission.getCode(), newPermission);
                return true;
            }
        }
        return false;
    }

    /**
     * Преинициализация кеша, если это необходимо
     */
    private void preInit() {
        // Если стоит системное свойство "использовать кеш" и если кеш не проинициализирован, то инициализируем его из DAO
//        if (systemService.isUseCache()) {
//        if (!permissionCache.isInitialised()) {
//            permissionCache.initFromList(permissionDao.getAllPermissions());
//        }

//        } else {
        // очищаем кеш
//            userCache.clearRecords();
//            permissionToUserCache.clearRecords();
//        }
    }
}
